package com.bcx.crm.java.jdbc.exportExcel;

import com.bcx.crm.entity.IntactStaff;

import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by ys on 2019/4/19 1:44
 */
public class GetResultSet {
    public static void main(String[] args) throws Exception {
        Connection con=null;
        PreparedStatement ps =null;
        ResultSet rs=null;
        try {
            //加载数据库驱动
            Class.forName("oracle.jdbc.OracleDriver");
            //通过驱动管理类获取数据库链接
            con = DriverManager.getConnection("jdbc:oracle:thin:@10.16.26.16:1521:PROD", "ltcins_biz_intact", "123456");
            String sql="select * from INTACT_STAFF ";
            //执行sql语句
            ps = con.prepareStatement(sql);
//			ps.setInt(1, 8);
            //遍历查询结果集
            rs = ps.executeQuery();
            while(rs.next()){
                List list = resultSetToList(rs,IntactStaff.class);
                list.iterator();
                // 用于获取列数、或者列类型
//				ResultSetMetaData meta = rs.getMetaData();
                IntactStaff intactStaff = new IntactStaff(1L);

//				BeanUtils.copyProperties(assessOrder,rs);
//				System.out.println("姓名： "+rs.getString("name")+" 年龄："+rs.getInt("age")+" id: "+rs.getInt("id"));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e){
            e.printStackTrace();
        }finally{
            //关闭资源
            try{
                if(rs != null){
                    rs.close();
                }
                if(ps != null){
                    ps.close();
                }
                if(con != null){
                    con.close();
                }
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
    }

    public static List resultSetToList(ResultSet rs, Class cls)throws Exception {


        //取得Method
        Method[] methods = cls.getDeclaredMethods();
        System.out.println(methods[0].getName());
        List lst = new ArrayList();
        // 用于获取列数、或者列类型
        ResultSetMetaData meta = rs.getMetaData();
        Object obj = null;
        while (rs.next()) {
            // 获取formbean实例对象
            obj = cls.newInstance(); // 用Class.forName方法实例化对象和new创建实例化对象是有很大区别的，它要求JVM首先从类加载器中查找类，然后再实例化，并且能执行类中的静态方法。而new仅仅是新建一个对象实例
            // 循环获取指定行的每一列的信息
            for (int i = 1; i <= meta.getColumnCount(); i++) {
                // 当前列名
                String colName = meta.getColumnName(i);

                // 设置方法名
                String setMethodName = "set" + colName;


                //遍历Method
                for (int j = 0; j < methods.length; j++) {
                    if (methods[j].getName().equalsIgnoreCase(setMethodName)) {
                        setMethodName = methods[j].getName();

                        System.out.println(setMethodName);
                        // 获取当前位置的值，返回Object类型
                        Object value = rs.getObject(colName);
                        if(value == null){
                            continue;
                        }

                        //实行Set方法
                        try {
                            //// 利用反射获取对象
                            //JavaBean内部属性和ResultSet中一致时候
                            Method setMethod = obj.getClass().getMethod(
                                    setMethodName, value.getClass());
                            setMethod.invoke(obj, value);
                        } catch (Exception e) {
                            //JavaBean内部属性和ResultSet中不一致时候，使用String来输入值。
                            e.printStackTrace();
                        }
                    }
                }
            }
            lst.add(obj);
        }

        return lst;

    }
}
